package com.itheima.common;

import cn.hutool.json.JSONUtil;
import com.itheima.enums.TokenErrorEnum;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * <h1>全局异常捕获</h1>
 *
 * @author <a href="515857087@qq.com">叶世铭</a>
 * @RestControllerAdvice都是对Controller进行增强的，可以全局捕获spring mvc抛的异常。
 * ExceptionHandler 可以全局仅捕获一种异常，也可以全局捕获多种异常，从上到下 依次处理
 * @since 2022/10/21
 */

@RestControllerAdvice
public class GlobalAdvice {

    /**
     * ExceptionHandler的作用是用来捕获权限的异常
     * 这里示例 捕获 Exception异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(RoleException.class)
    public R<String> RoleException(Exception e) {
        return R.error("权限异常" + e.getMessage());
    }

    /**
     * 捕获普通错误信息
     *
     * @return
     */
    @ExceptionHandler(DefaultException.class)
    public R<String> defaultException(Exception e) {
        return R.error(e.getMessage());
    }

    /**
     * 捕获@NotNull校验的异常信息
     *
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public R<String> methodArgumentNotValidException(MethodArgumentNotValidException e) {
        Iterator<FieldError> iterator = e.getBindingResult().getFieldErrors().iterator();
        List<String> errorList = new ArrayList<>();
        while (iterator.hasNext()) {
            errorList.add(iterator.next().getDefaultMessage());
        }
        return R.error(JSONUtil.toJsonStr(errorList));
    }

    @ExceptionHandler(TokenException.class)
    public R<String> tokenException(Exception e) {
        return R.error(TokenErrorEnum.valueOf(e.getMessage()));
    }
}
